//
//  XLMediator.m
//  CentreDispatchModularization
//
//  Created by 薛磊 on 2018/3/31.
//  Copyright © 2018年 xuelei. All rights reserved.
//

#import "XLMediator.h"

@implementation XLMediator


+(instancetype)sharedInstance{
    static XLMediator * xlmediator;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        xlmediator = [[XLMediator alloc] init];
    });
    return xlmediator;
 
}
// ******************** NOTE  ************************

// targetName 是 Target_XXX 类文件 的 XXX 部分
// actionName 是定义在 Target_XXX 类文件中的 select name 后半部分

// 此函数的作用：
//  传入 Target_XXX.h 文件中 xxx 的字符串； NSClassFromString 动态生成类
//  传入 Target_XXX.h 文件中 action selector 的函数名字符串； NSSelectorFromString 动态生成 函数

// ******************** NOTE  ************************

-(id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params{
    
    // 类名 Target_XXX.h
    NSString * targetClassString = [NSString stringWithFormat:@"Target_%@",targetName];
    Class targetClass = NSClassFromString(targetClassString);
    id target = [[targetClass alloc] init];
    // 函数名 Action_XXX:
    NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];
    SEL action = NSSelectorFromString(actionString);
    
    if (target == nil) {
        // 这里是处理无响应请求的地方之一，这个demo做得比较简单，如果没有可以响应的target，就直接return了。实际开发过程中是可以事先给一个固定的target专门用于在这个时候顶上，然后处理这种请求的
        NSLog(@"未提供对应的 targetClassString 类");
        return nil;
    }
    if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
    } else {
        // 这里是处理无响应请求的地方，如果无响应，则尝试调用对应target的notFound方法统一处理
        //TODO: Target_XXX.h 文件中，需要提供 notFound 函数
        
        SEL action = NSSelectorFromString(@"notFound:");
        if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
        } else {
            // 这里也是处理无响应请求的地方，在notFound都没有的时候，这个demo是直接return了。实际开发过程中，可以用前面提到的固定的target顶上的。
            NSLog(@"targetClassString类 未提供对应的 notFound: 函数");
            return nil;
        }
    }
    
}
@end
